/*
封装实现一个SqliteHelper 提供简单的sqlite数据库的操作接口，实现增删查改
1.创建和打开数据库文件接口
2.数据库的执行操作
   1.表的操作
   2.数据的操作

3.数据库的关闭   
*/
#ifndef _M_logger_S
#define _M_logger_S
#include <iostream>
#include<sqlite3.h>
#include<string>
#include<vector>
#include"../../mqcommon/mq_logger.hpp"
namespace ljhmq
{
class SqliteHelper
{
public:
typedef int (*SqliteCallback)(void*,int,char**,char**);
SqliteHelper(const std::string& dbfile):_dbfile(dbfile){}

//打开
//int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
bool open(int safe_leve=SQLITE_OPEN_FULLMUTEX)
{
int ret=sqlite3_open_v2(_dbfile.c_str(),&_handler,SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|safe_leve,nullptr);
if(ret!=SQLITE_OK)
{
//std::cout<<"创建/打开数据库失败：";
//std::cout<<sqlite3_errmsg(_handler)<<std::endl;
ELOG("创建/打开数据库失败：%s",sqlite3_errmsg(_handler));
return false;
}
return true;
}
//执行sql语句
//int sqlite3_exec(sqlite3*, char *sql, int (*callback)(void*,int,char**,char**), void* arg, char **err)
bool exec(const std::string& sql,SqliteCallback cb,void *arg)
{
 int ret=sqlite3_exec(_handler,sql.c_str(),cb,arg,nullptr);
    if(ret!=SQLITE_OK)
    {
        std::cout<<sql;
       // std::cout<<"执行语句失败：";
       // std::cout<<sqlite3_errmsg(_handler)<<std::endl;
       ELOG("%s \n执行语句失败：%s",sql.c_str(),sqlite3_errmsg(_handler));
        return false;

    }
return true;
}
//关闭
void close(){
//int sqlite3_close_v2(sqlite3*);
if(_handler) sqlite3_close_v2(_handler);
}
private:
std::string _dbfile;
sqlite3* _handler;
};
}
#endif